﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;
using System.Reflection;

namespace Activities.DAL.Utility
{
    public static class Extension
    {
        //public static class ObjectExtension
        // {
        //public static string ToXML(this DataTable dt)
        //{
        //    DataTable dtCloned = dt.Clone();
        //    foreach (DataColumn dc in dtCloned.Columns)
        //        dc.DataType = typeof(string);
        //    foreach (DataRow row in dt.Rows)
        //    {
        //        dtCloned.ImportRow(row);
        //    }

        //    foreach (DataRow row in dtCloned.Rows)
        //    {
        //        for (int i = 0; i < dtCloned.Columns.Count; i++)
        //        {
        //            dtCloned.Columns[i].ReadOnly = false;

        //            if (string.IsNullOrEmpty(row[i].ToString()))
        //                row[i] = string.Empty;
        //        }
        //    }

        //    DataSet ds = new DataSet();
        //    ds.Tables.Add(dtCloned);
        //    string xml = ds.GetXml();

        //    return xml;
        //}

        //public static DataTable AddRowNumber(this DataTable dataSource, string columnName, int startIndex)
        //{
        //    int rownumber = startIndex;
        //    DataColumn newCol = dataSource.Columns.Add(columnName, typeof(int));
        //    foreach (DataRow row in dataSource.Rows)
        //    {
        //        row[columnName] = rownumber;
        //        rownumber++;
        //    }

        //    return dataSource;
        //}

        //public static DataView SortDataTable(this DataTable dataSource, string sortname, string sorttype)
        //{
        //    if (dataSource != null)
        //    {
        //        DataView myDataView = new DataView(dataSource);
        //        if (sortname != string.Empty)
        //        {
        //            myDataView.Sort = string.Format("{0} {1}",
        //            sortname, sorttype);
        //        }
        //        return myDataView;
        //    }
        //    else
        //    {
        //        return new DataView();
        //    }
        //}

        //public static DataTable SortDataTable(this DataTable dataSource, string sortname, string sorttype, int start, int count)
        //{
        //    if (dataSource == null || dataSource.Rows.Count == 0)
        //    {
        //        return dataSource;
        //    }
        //    else
        //    {
        //        DataView myDataView = new DataView(dataSource);
        //        if (sortname != string.Empty)
        //        {
        //            myDataView.Sort = string.Format("{0} {1}", sortname, sorttype);
        //        }
        //        EnumerableRowCollection<DataRow> row = myDataView.ToTable().AsEnumerable();
        //        DataTable result = row.Skip(start).Take(count).CopyToDataTable();

        //        return result;
        //    }
        //}

        //public static DataTable ToDataTable<T>(this IList<T> data)
        //{
        //    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        //    DataTable table = new DataTable();
        //    for (int i = 0; i < props.Count; i++)
        //    {
        //        PropertyDescriptor prop = props[i];
        //        table.Columns.Add(prop.Name, prop.PropertyType);
        //    }
        //    object[] values = new object[props.Count];
        //    foreach (T item in data)
        //    {
        //        for (int i = 0; i < values.Length; i++)
        //        {
        //            values[i] = props[i].GetValue(item);
        //        }
        //        table.Rows.Add(values);
        //    }
        //    return table;
        //}

            public static List<T> ConvertTo<T>(this DataTable datatable) where T : new()
            {
                List<T> Temp = new List<T>();
                try
                {
                    List<string> columnsNames = new List<string>();
                    foreach (DataColumn DataColumn in datatable.Columns)
                    {
                        columnsNames.Add(DataColumn.ColumnName);
                    }
                    Temp = datatable.AsEnumerable().ToList().ConvertAll<T>(row => getObject<T>(row, columnsNames));
                    return Temp;
                }
                catch
                {
                    return Temp;
                }

            }
            public static T getObject<T>(DataRow row, List<string> columnsName) where T : new()
            {
                T obj = new T();
                try
                {
                    string columnname = "";
                    string value = "";
                    PropertyInfo[] Properties;
                    Properties = typeof(T).GetProperties();
                    foreach (PropertyInfo objProperty in Properties)
                    {
                        columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower());
                        if (!string.IsNullOrEmpty(columnname))
                        {
                            value = row[columnname].ToString();
                            if (!string.IsNullOrEmpty(value))
                            {
                                if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null)
                                {
                                    value = row[columnname].ToString().Replace("$", "").Replace(",", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null);
                                }
                                else
                                {
                                    value = row[columnname].ToString().Replace("%", "");
                                    objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);
                                }
                            }
                        }
                    }
                    return obj;
                }
                catch
                {
                    return obj;
                }
            }



       // }

   
    }
}